
#include "esp_system.h"
#include "esp_log.h"
#include <stdio.h>
#include <math.h>

/************************************* NTC10K ******************************************** */
#define _NTC_R_SERIES         150000.0f
#define _NTC_R_NOMINAL        10000.0f
#define _NTC_TEMP_NOMINAL     25.0f
//#define _NTC_ADC_MAX          4096.0f //  12bit
#define _NTC_BETA             3950
//#define _NTC_ADC_VREF         2.6f // v
#define _NTC_VDD              3.175f // v

// static const char *TAG = "ntc_sensor";

//#define ADC_2_V(x) ((float)(x) * _NTC_ADC_VREF / _NTC_ADC_MAX)
//#define ADC_2_V(x) ((x) * 0.000715625)

float pt1000_calculate_resistance(float voltage)
{
	return _NTC_R_SERIES / ((_NTC_VDD / (voltage/1000.0)) - 1.0f);
}

//#######################################################################################
float pt1000_calculate_temperature(float rntc)
{
  float temp;
  temp = rntc / (float)_NTC_R_NOMINAL; 
  temp = logf(temp);
  temp /= (float)_NTC_BETA;
  temp += 1.0f / ((float)_NTC_TEMP_NOMINAL + 273.15f);
  temp = 1.0f / temp;
  temp -= 273.15f;
  return temp;
}

//#######################################################################################

/************************************* PT100 ******************************************** */
// 定义常数
#define R0 100.0  // PT100 在 0°C 时的电阻 (100 欧姆)
#define A 3.9083e-3
#define B -5.775e-7
// 惠斯通电桥相关常数
#define R1 2000.0  // 惠斯通电桥的电阻 (2000 欧姆)
#define R2 2000.0  // 惠斯通电桥的电阻 (2000 欧姆)
#define R3 75.0  // 惠斯通电桥的电阻 (75 欧姆)
#define V_REF 3.0  // 输入电压 (3.0 V)

// 根据电压计算电阻的函数
float pt100_calculate_resistance(float v_out) {
    const float v2 = V_REF * R3 / (R2+R3);
    float v1 = v_out + v2;
    return R1*v1/(V_REF-v1);
    // return r_ref * (v_out / (v_ref - v_out));
}

// 根据电阻计算温度的函数
float pt100_calculate_temperature(float r_pt100) {
    float temp;
    temp = (-A + sqrt(A * A - 4 * B * (1 - r_pt100 / R0))) / (2 * B);
    return temp;
}

int pt100_test() {
    // 输入电压和参考电阻值
    float v_out = 1.0; // 假设测量到的电压 (V)
    float v_ref = 5.0;  // 输入电压 (V)
    float r_ref = 100.0; // 参考电阻 (欧姆)

    // 计算PT100的电阻
    float r_pt100 = pt100_calculate_resistance(v_out);
    printf("PT100 电阻: %.2f 欧姆\n", r_pt100);

    // 计算温度
    float temperature = pt100_calculate_temperature(r_pt100);
    printf("温度: %.2f °C\n", temperature);

    return 0;
}
